package com.cwh.taskcenter.domain.task.model;

import cn.hutool.core.date.LocalDateTimeUtil;
import com.alibaba.cola.domain.Entity;
import com.alibaba.cola.exception.BizException;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;


/**
 * Task聚合根
 * 负责维护任务的生命周期和业务规则
 * @author cwh
 */
@Slf4j
@Data
@Entity
public class Task {


    /**
     * 任务状态
     */
    private TaskStatus taskStatus;

    /**
     * 任务模板ID
     */
    private Long id;

    /**
     * 任务标题
     */
    private String taskTitle;

    /**
     * 任务副标题
     */
    private String taskSubtitle;

    /**
     * 任务描述
     */
    private String taskDescription;

    /**
     * 任务封面url
     */
    private String taskCoverUrl;

    /**
     * 任务类型: 周期性/非周期性
     */
    private String taskType;

    /**
     * 任务周期(1:一次性 2:每日 3:每周 4:每月 5:自定义)'
     */
    private String cycleType;

    /**
     * 领取类型: AUTO-自动参与/MANUAL-需手动领取
     */
    private String claimType;

    /**
     * 开始时间
     */
    private LocalDateTime startTime;

    /**
     * 结束时间
     */
    private LocalDateTime endTime;

    /**
     * 最大参与次数
     */
    private Integer maxParticipate;


    /**
     * 创建时间
     */
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    private LocalDateTime updateTime;

    /**
     * 用户群体类型(1:全部用户 2:新用户 3:活跃用户 4:自定义用户组)
     */
    private String userGroupType;

    /**
     * 任务规则
     */
    private List<TaskRule> taskRules;

    /**
     * 规则表达式
     */
    private String ruleJson;

    /**
     * 最新的一条任务记录
     */
    private UserTask lastUserTask;


    /**
     * 判断任务时间是否有效
     * @return true/false
     */
    public boolean isValidTime() {
        if (startTime == null || endTime == null) {
            return true;
        }
        LocalDateTime now = LocalDateTime.now();
        return now.isAfter(startTime) && now.isBefore(endTime);
    }


    public boolean isAutoClaim() {
        return ClaimType.AUTO.name().equals(this.claimType);
    }

    /**
     * 是否可领取
     */
    public void checkTaskAcceptable() {
        // 任务是否在活动时间内
        if (!isValidTime()) {
            throw new BizException("任务不在活动时间范围内");
        }

        // 任务状态是否为激活
        if (!taskStatus.isExecutable()) {
            throw new BizException("任务未激活");
        }
    }


    /**
     * 校验用户任务是否满足可执行条件
     */
    public boolean validateUserTask() {
        if (lastUserTask == null) {
            return true;
        }
        // 根据任务类型判断任务是否重复
        switch (TaskType.fromString(this.taskType)) {
            case DAILY:
                if (LocalDateTimeUtil.isSameDay(lastUserTask.getCreatedAt(), LocalDateTime.now())) {
                    log.info("用户任务已存在，不能重复执行");
                    return false;
                }
                break;
            default:
                break;
        }
        return true;
    }

}